/**
  * Author: Mei
  * Date: 2021-01-05 15:06
  * Description: 
  *
  */
#include <memory>
#include <iostream>
#include <functional>

using namespace std;

//支持普通指针
template<typename T, class ...Args>
typename enable_if<!is_array<T>::value, unique_ptr<T>>::type
make_unique(Args&&...args) {
    return unique_ptr<T>(new T(forward<Args>(args)...));
};

//支持动态数组
template<typename T>
typename enable_if<is_array<T>::value && extent<T>::value == 0, unique_ptr<T>>::type
make_unique(size_t size) {
    typedef typename remove_extent<T>::type U; //std::remove_extent返回数组降低一个维度后的数据类型 比如传入int[] 经过remove_extent之后得到int 同样二维经过得到一维
    cout<<typeid(T).name();
    return unique_ptr<T>(new U[size]);
};

//过滤掉定长数组的情况
template<typename T, class ...Args>
typename enable_if<extent<T>::value != 0, void>::type
make_unique(Args &&...args) = delete;

int main() {
    unique_ptr<int[]> up = make_unique<int[]>(2);
    up[0] = 20;
    cout << up[0] << endl;
}